WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Probleme mit GUI1 -> GUI2 -> GUI3 -> Graphen speich

 

JaSoIstEs
Forum-Guru

Forum-Guru


Beiträge: 266
Anmeldedatum: 01.10.12
Wohnort: Hessen
Version: 2019b
     Beitrag Verfasst am: 11.12.2014, 19:56     Titel: Probleme mit GUI1 -> GUI2 -> GUI3 -> Graphen speich
  Antworten mit Zitat      
Guten Abend,

habe mal wieder ein GUI Problem (wie immer =))!!

Und zwar sieht der wie folgt aus:

Rufe GUI1 auf --> dann von dort aus GUI2 ---> und dann GUI3

In GUI3 habe ich einen Plot der auf Wunsch gespeichert werden soll via PushButton....

Meine funktion für den Button habe ich aber nicht in der "GUIName".m sondern in einer anderen File (mittels Switch-Case).

Der Zugriff zum Button funktioniert Prima aber die Daten aus der "axes1" zu bekommen klappt irgendwie nicht....

folgend der Code ausschnitt...

Danke im Voraus.

Code:
function [] = SaveGraph()

data            = get(gcbf, 'UserData');
Axes            = findobj(gcbf,'Tag','axes1');
%Axes            = get(Axes,'Tag');

f = figure;%('visible','off');
f_copy = axes;
copyobj(allchild(Axes),f_copy);
colorbar
grid on
[filename,pathname] = uiputfile({'*.jpg;*.tif;*.png;*.gif;*.fig','All Image Files';...
          '*.*','All Files' },'Save Image');
saveas(f,[pathname,filename],'jpg');
close(figure)
Private Nachricht senden Benutzer-Profile anzeigen


JaSoIstEs
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 266
Anmeldedatum: 01.10.12
Wohnort: Hessen
Version: 2019b
     Beitrag Verfasst am: 12.12.2014, 15:18     Titel:
  Antworten mit Zitat      
Hab jetzt meinen Code leicht abgeändert funktioniert immer noch nicht...
Bekomme irgendwie keinen Zugriff zur "axes1" von der GUI.

Code:
function [] = SaveGraph()
data            = get(gcbf, 'UserData');

SaveGRAPH       = findobj(gcbf,'Tag','SaveGraph');
SaveGRAPH       = get(SaveGRAPH,'Value');
GRAPHaxes       = findobj(gcbf,'Tag','axes1');

if SaveGRAPH == 1
    SaveGRAPH       = findobj(gcbf,'Tag','SaveGraph');
    f = figure('visible','off');
    f_copy = axes;
    copyobj(GRAPHaxes,f_copy);
    colorbar
    grid on
    [filename,pathname] = uiputfile({'*.jpg;*.tif;*.png;*.gif;*.fig','All Image Files';...
        '*.*','All Files' },'Save Image');
    saveas(f,[pathname,filename],'jpg');
    close(figure)  
end
Private Nachricht senden Benutzer-Profile anzeigen
 
JaSoIstEs
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 266
Anmeldedatum: 01.10.12
Wohnort: Hessen
Version: 2019b
     Beitrag Verfasst am: 12.12.2014, 19:38     Titel:
  Antworten mit Zitat      
Habe es jetzt wie folgt geändert:

Code:
function [] = SaveGraph()

data            = get(gcbf,'UserData');

 [filename,pathname] = uiputfile({'*.jpg;*.tif;*.png;*.gif;*.fig','All Image Files';...
    '*.*','All Files' },'Save Image');
 saveas(gca,[pathname,filename],'jpg');
% close(figure)


Hier speichert er leider nur die Ganze GUI und nicht nur das axes Feld.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 17.12.2014, 22:10     Titel:
  Antworten mit Zitat      
Hallo,

es ist sehr schwierig, Code-Schnipsel ohne den Gesamtkontext zu verstehen.
Bitte auch immer beschreiben, was nicht klappt oder funktioniert. Gibt es eine Fehlermeldung? Ein unerwartetes Verhalten? Welche bzw. inwiefern?

Die möglichen Ansätze zur Kommunikation zwischen GUIs sind generell hier nachzulesen:
http://de.mathworks.com/help/matlab.....data-among-callbacks.html

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Freimann
Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 09.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.12.2014, 22:52     Titel:
  Antworten mit Zitat      
du kannst das mit Hilfe export_fig machen

http://www.mathworks.com/matlabcent.....exchange/23629-export-fig

hier Beispiel

Code:
function saveout = save_2d(X,name)

[file,path]=uiputfile({'*.png';'*.jpg';'*.tif';'*.eps';'*.pdf'},'Save Figure As',name);
if file ~= 0
   
    %Gets the size of the file name
    [empty,filechar]=size(file);  
   
    %Deletes the file type from teh end of the file name und stores it
    filetype(3)=file(filechar);    
    filetype(2)=file(filechar-1);
    filetype(1)=file(filechar-2);
    file(filechar)=[];
    file(filechar-1)=[];
    file(filechar-2)=[];
    file(filechar-3)=[];
   
    %Run the export_fig command with the path and file name, along with filetype
    %export_fig(X,[path,file],['-',filetype],'-painters');
    set(gca, 'Color', 'none');
    export_fig(X,[path,file],['-',filetype],'-painters','-transparent');
    set(gca, 'Color', 'w');

   
%    
    %Message box
 
     
     h=msgbox({'Done!';...
         ['The file "',file,'.',filetype,'" can be found in:'];path},...
         'Save Figure File','none','modale');
elseif isempty(file)==0
   
     h=msgbox('Not saved.',...
        'Save Figure File','none','modal');

end
end


und in push button

Code:
save_2d(handles.axes1,'vorschlag name')
Private Nachricht senden Benutzer-Profile anzeigen
 
JaSoIstEs
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 266
Anmeldedatum: 01.10.12
Wohnort: Hessen
Version: 2019b
     Beitrag Verfasst am: 18.12.2014, 19:07     Titel:
  Antworten mit Zitat      
Hallo,

danke für beide Antworten.

Um es mal zu erklären ich habe eigentlich schon Erfahrung mit GUIs und deren gegenseitige Übergabe von Daten, nur das Problem ist ich habe hier einen Code bekommen den ich zum Teil "repariert" und erweitert habe.

Ich habe aber immer mit den automatisch erstellten Codes (bzw. Callbacks) gearbeitet (z.B. evalin, assignin usw.).

Hier wird der Code aber in einer separat erstellten M-File geschrieben.

In der automatisch generierten M-File wurde lediglich dies geschrieben:


Code:

unction varargout = ImdEctr(varargin)
% PLTBACRES Application M-file for ImdEctr.fig
%    FIG = PLTBACRES launch ImdEctr GUI.
%    PLTBACRES('callback_name', ...) invoke the named callback.

% Last Modified by GUIDE v2.5 12-Dec-2014 17:49:24

if nargin == 0  % LAUNCH GUI

   fig = openfig(mfilename,'reuse');

   % Generate a structure of handles to pass to callbacks, and store it.
   handles = guihandles(fig);
   guidata(fig, handles);

   if nargout > 0
      varargout{1} = fig;
   end

elseif ischar(varargin{1}) % INVOKE NAMED SUBFUNCTION OR CALLBACK

   try
      [varargout{1:nargout}] = feval(varargin{:}); % FEVAL switchyard
   catch
      disp(lasterr);
   end

end
 


Und ein Beispiel für einen Callback in dieser M-File sieht wie folgt aus:

Code:

function varargout = VoltageX_Callback(h, eventdata, handles, varargin)
% Stub for Callback of the uicontrol handles.VoltageX.
disp('VoltageX Callback not implemented yet.')
 



In der selbst erstellten M-File wird mit folgendem angefangen (Mit den "Tags" der einzelnen Elemente aus der GUI):

Code:

% Callbacks to Initial Machine Sizing
% ===================================


function []=PltResAct(action)

switch action
case 'FrequencyZ'
    frequencyZ
case 'VlinermsZ'
    vlinermsZ
case 'IlinermsZ'        
    ilinermsZ          
case 'IlinepeakZ'
    ilinepeakZ
case 'IlineaveZ'
    ilineaveZ    
case 'VphasermsZ'
    vphasermsZ
case 'IphasermsZ'        
    iphasermsZ          
case 'IphasepeakZ'
    iphasepeakZ
case 'IphaseaveZ'
    iphaseaveZ  
case 'IrippleZ'
    irippleZ
case 'IsupplyZ'
    isupplyZ    
case 'PFZ'
    pfZ
case 'EfficiencyZ'
    efficiencyZ    
case 'SiptZ'
    siptZ
case 'PiptZ'
    piptZ
case 'PoutZ'
    poutZ
case 'PlossZ'
    plossZ
case 'VdZ'
    vdZ
case 'VqZ'
    vqZ
case 'IdZ'
    idZ
case 'IqZ'
    iqZ
case 'LdZ'
    ldZ
case 'LqZ'
    lqZ
case 'XdZ'
    xdZ
case 'XqZ'
    xqZ
case 'RphaseZ'
    rphaseZ
case 'LphaseZ'
    lphaseZ
case 'MphaseZ'
    mphaseZ
case 'AdvZ'
    advZ    
case 'CndZ'
    cndZ      
case 'OmegaZ'
    omegaZ
case 'TorqueZ'
    torqueZ
case 'TrippleZ'
    trippleZ
case 'TotalLossZ'
    totallossZ
case 'StatorLossZ'
    statorlossZ
case 'RotorLossZ'
    rotorlossZ
case 'OhmicLossZ'
    ohmiclossZ
case 'IronLossZ'
    ironlossZ
case 'MagnetLossZ'
    magnetlossZ
case 'WWFZ'
    wwfZ
case 'AddLossZ'
    addlossZ
case 'ConverterLossZ'
    converterlossZ
case 'Plot'
    plotres
case 'ASCII'
    ascii
case 'PUOnOff'
    puonoff
case 'GridOnOff'
    gridonoff
case 'UserDataDate'
    userdata
case 'UserDataUser'
    userdata
case 'UserDataIdentifier'
    userdata
case 'UserDataComment'
    userdata
case 'SaveGraph'
    SaveGraph      
otherwise
   disp(['Action ',action,' is not defined!'])
end
 


Hier wird viel mit findobj(gcbf,...) gearbeitet wie z.B. :

Code:

FrequencyZ  = findobj(gcbf, 'Tag', 'FrequencyZ');
 


und

Code:

data            = get(gcbf,'UserData');
 


Um an die Daten ranzukommen.


Ich habe hier einen weiteren "Button" hinzugefügt der mir den Graphen (in einer axes in der GUI) speichern soll und dieser sieht wie folgend aus:


Code:


function [] = SaveGraph()

data            = get(gcbf,'UserData');

 [filename,pathname] = uiputfile({'*.jpg;*.tif;*.png;*.gif;*.fig','All Image Files';...
    '*.*','All Files' },'Save Image');
 saveas(gca,[pathname,filename],'jpg');
 


Dies speichert mir aber die ganze GUI als Bild. Ich brauche aber nur die "axes1" aus der GUI.

Die Frage ist hier wie komme ich an die "axes1" ran.

Wenn ich folgenden Code direkt in die eigentliche GUI-M-File speichere funktioniert alles aber nur wenn ich diese direkt von dort aus starte.
Ich möchte diesen Code aber auch gerne die die selbst erstellte M-File einfügen um keine "Unordnung" in den ganzen M-Files zu erstellen.

Code:

% --- Executes on button press in SaveGraph.
function varargout = SaveGraph_Callback(h, eventdata, handles, varargin)
% hObject    handle to SaveGraph (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% handles = guidata(hObject);
f = figure('visible','off');
f_copy = axes;
copyobj(allchild(handles.axes1),f_copy);
colorbar
grid on
[filename,pathname] = uiputfile({'*.jpg;*.tif;*.png;*.gif;*.fig','All Image Files';...
          '*.*','All Files' },'Save Image');
saveas(f,[pathname,filename],'jpg');
close(figure)
 



Habe auch folgendes Probiert:

Code:

function [] = SaveGraph()

data            = get(gcbf,'UserData');
FindAxes        = findobj(gcbf, 'Tag', 'axes1');


f = figure('visible','off');
f_copy = axes;
copyobj(FindAxes,f_copy);
colorbar
grid on
 [filename,pathname] = uiputfile({'*.jpg;*.tif;*.png;*.gif;*.fig','All Image Files';...
    '*.*','All Files' },'Save Image');
 saveas(f,[pathname,filename],'jpg');
close(figure)
 


Hier bekomme ich leider nur ein leeres Bild(mit einer axes und colorbar) gespeichert.



Hoffe das war jetzt nicht zu viel.

Und vielen vielen Danke für eure Hilfe im Voraus.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 18.12.2014, 20:23     Titel:
  Antworten mit Zitat      
Hallo,

da postest du ellenlangen Code, aber axes1 kommt nicht vor.
Was ist also axes1?

Grundsätzlich sind alle Handles in der handles-Struktur enthalten, und diese muss man übergeben oder sich mittels guidata holen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
JaSoIstEs
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 266
Anmeldedatum: 01.10.12
Wohnort: Hessen
Version: 2019b
     Beitrag Verfasst am: 18.12.2014, 20:40     Titel:
  Antworten mit Zitat      
Oh sorry,

also "axes1" ist der Tag des Plottes in der GUI. siehe angehängtes Bild.

GUI_Mit_Axes1.JPG
 Beschreibung:

Download
 Dateiname:  GUI_Mit_Axes1.JPG
 Dateigröße:  129.57 KB
 Heruntergeladen:  451 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 18.12.2014, 23:00     Titel:
  Antworten mit Zitat      
... und? Vorschlag umgesetzt?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
JaSoIstEs
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 266
Anmeldedatum: 01.10.12
Wohnort: Hessen
Version: 2019b
     Beitrag Verfasst am: 19.12.2014, 12:21     Titel:
  Antworten mit Zitat      
Hallo,

habe den Code wie folgt geändert:

Code:

function [] = SaveGraph()
handles         = guidata(PltBacRes);
% data            = get(gcbf,'UserData');
% FindAxes        = findobj(gcbf, 'Tag', 'axes1');

f = figure('visible','off');
f_copy = axes;
copyobj(allchild(handles.axes1),f_copy);
colorbar
grid on
 [filename,pathname] = uiputfile({'*.jpg;*.tif;*.png;*.gif;*.fig','All Image Files';...
    '*.*','All Files' },'Save Image');
 saveas(f,[pathname,filename],'jpg');
close(figure)
 


Solange ich nichts am Plot "ändere" sprich nicht auf den Plot-Button (axes1 bleibt leer) drücke findet er die "axes1" noch.

Sobald ich etwas Plotten lasse verschwindet die "axes1" aus den handles und folgender Fehler erscheint:

________________________________________________
Reference to non-existent field 'axes1'.

Error in PltBacResAct>SaveGraph (line 5197)
copyobj(allchild(handles.axes1),f_copy);

Error in PltBacResAct (line 110)
SaveGraph

Error while evaluating uicontrol Callback
________________________________________________

Ich weiß das man hier die GUI handles updaten muss nachdem etwas geändert wurde....

Aber in diesem Fall hier weiß ich leider nicht wo genau ich das einbauen soll.... Sad

Hier mal ein Plot-Code nach dem der Plot-Button gedrückt worden ist:

Code:

if EfficiencyZ
    plot(NDEMary, TDEMary, 'y', 'LineWidth', 4)
    xlabel('Speed in rpm.')
    ylabel('Torque in Nm')
    if GridOnOff
        grid on
    else
        grid off
    end
    hold on
    if isempty(ContourLines)
        contourf(rot90(SpeedColumn), rot90(TorqueRow), rot90(EfficiencyMTX),'LineColor','none');
    else
        contourf(rot90(SpeedColumn), rot90(TorqueRow), rot90(EfficiencyMTX),...
                          ContourLines,'LineColor','none');        
    end
    title('Efficiency Contour (in %)')
    colorbar;   datacursormode on;
    hold off
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 19.12.2014, 12:35     Titel:
  Antworten mit Zitat      
Hallo,

wo kommt denn PltBacRes her?
Wenn das der Name der GUI an sich ist, bettelt man damit quasi um Probleme.

Eine Möglichkeit, wie man vielleicht noch die Übergabe des Handles vermeiden kann (das willst du anscheinend nicht, warum auch immer), wäre Tag oder Name zu vergeben und dann mit findObj(0,...) danach zu suchen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
JaSoIstEs
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 266
Anmeldedatum: 01.10.12
Wohnort: Hessen
Version: 2019b
     Beitrag Verfasst am: 19.12.2014, 15:29     Titel:
  Antworten mit Zitat      
Ja das ist der Name der GUI.

Ich hab doch schon vorher versucht mit z.B.

Code:

FindAxes = findobj(gcbf,'Tag','axes1')
 


nach der axes mittels Tag in der GUI zu suchen oder verstehe ich dich jetzt falsch ?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 19.12.2014, 16:41     Titel:
  Antworten mit Zitat      
Hallo,

ich würde eben in 0 suchen.
Und am saubersten wäre, die Handles zu übergeben.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
JaSoIstEs
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 266
Anmeldedatum: 01.10.12
Wohnort: Hessen
Version: 2019b
     Beitrag Verfasst am: 19.12.2014, 17:29     Titel:
  Antworten mit Zitat      
Habe meinen Code wie folgt geändert:

Code:

function [] = SaveGraphButton()
%handles         = guidata(PltBacRes);

data            = get(gcbf,'UserData');
FindAxes         = findobj(0,'Tag','axes1');


f = figure('visible','off');
f_copy = axes;
copyobj(allchild(FindAxes),f_copy);
colorbar
grid on
 [filename,pathname] = uiputfile({'*.jpg;*.tif;*.png;*.gif;*.fig','All Image Files';...
    '*.*','All Files' },'Save Image');
 saveas(f,[pathname,filename],'jpg');
close(figure)
 


Das Bild das ich speichere bleibt aber leer.
Kannst du mir denn ein Beispiel nennen wie ich die handles hier ausgeben soll wenn ich es nicht mit dem Figure Namen machen soll?

Kann es sein das evtl. bei copyobj etwas schief geht ?

Oder liegt es evtl. daran das der Plot-Button auch eine eigene function ist/hat?

(Ich kann dir wenn du Lust und Zeit hast die ganze M-File mal zu kommen lassen, es ist schwierig immer kleine Schnipsel daraus zu zeigen. Das ganze ding besteht aus insgesamt 5260 Zeilen)
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 19.12.2014, 17:47     Titel:
  Antworten mit Zitat      
Hallo,

nicht aus-, sondern als Variable, als Eingabeargument übergeben.

Mache die Figure doch mal sichtbar. Zudem würde ich im Debugging-Modus mal nachsehen, ob FindAxes ein Objekt enthält.

Das ganze wäre sehr viel einfacher, wenn du ein reproduzierbares Beispiel liefern könntest. Es muss ja nicht der gesamte Code sein, im Gegenteil - es reicht vollkommen, wenn du es auf das wesentliche reduzierst.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2, 3  Weiter

Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.