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

Rangfolge mit PushButton bestimmen

 

Elyn44
Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 09.07.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.08.2019, 13:02     Titel: Rangfolge mit PushButton bestimmen
  Antworten mit Zitat      
Hallo,

ich habe eine GUI wo ich 4 verschiedene Bilder anklicken und auf die Workspace speichern kann. Leider speichert die sich immer in eine gleiche Reihenfolge ab, egal wie ich es andrücke.

Gibt es eine Möglichkeit die Bilder in die Reihenfolge abzuspeichern, wie ich die angedrückt habe?

Mein Code lautet zB für ein Bild (Axes.1):

Code:

%Erstellen des ersten Bildes
files = dir('/Users/Documents/MATLAB/IR1/**/*.dcm')
num_files = numel(files);

%Zufallsbild auswählen
filename = files(randi(num_files)).name;
img = dicomread(filename);

%Bild an der Achse darstellen
axes(handles.axes1);
img = mat2gray(im2double(img));
himg = imshow(img);
himg.UserData = filename;

% --- Executes on button press in PickOne.
function PickOne_Callback(hObject, eventdata, handles)
% hObject    handle to PickOne (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
imh = findobj(handles.axes1, 'type', 'image');
image1 = get(imh, 'CData');
origname = imh.UserData;

%auf piktogramm erscheinen lassen
imshow(image1, 'Parent', handles.axes5)

%save to workspace
assignin('base','IR1', origname)


Das ganze sieht dann so aus wie im Screenshot. Es hat immer eine Reihenfolge mit IR1 - IR3 - IR4 - IR5

Bildschirmfoto 2019-08-09 um 12.59.51.png
 Beschreibung:

Download
 Dateiname:  Bildschirmfoto 2019-08-09 um 12.59.51.png
 Dateigröße:  14.71 KB
 Heruntergeladen:  374 mal
Private Nachricht senden Benutzer-Profile anzeigen


sijuherm
Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 01.08.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.08.2019, 13:40     Titel:
  Antworten mit Zitat      
Wäre wohl sinnvoller gewesen bei deinen alten Threads(1 | 2) auf die Nachfragen einzugehen, statt die gleiche Frage erneut zu stellen.

Wenn du die Bilder im Workspace sortiert haben willst nach Klickreihenfolge und jedes Bild eine eigene Variable sein soll, dann würde ich das über einen Präfix lösen:
Code:
%save to workspace
savename = sprintf('Bild%i_%s',clickx,origname);
assignin('base','IR1', savename)

clickx entspricht dabei der Klickreihenfolge.
Private Nachricht senden Benutzer-Profile anzeigen
 
Elyn44
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 09.07.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.08.2019, 13:58     Titel:
  Antworten mit Zitat      
Hallo, danke für deine Antwort.

Tut mir Leid. Ich wollte ursprünglich die letzten Threads löschen, finde aber die Funktion dafür nicht. :/
Private Nachricht senden Benutzer-Profile anzeigen
 
Elyn44
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 09.07.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.08.2019, 11:34     Titel:
  Antworten mit Zitat      
@sijuherm

Leider hat clickx nicht geklappt. Es gibt mir andauernd diese Fehlermeldung raus:

Code:
Undefined function or variable 'clickx'.

Error in test2>PickOne_Callback (line 174)
savename = sprintf('Bild%i_%s',clickx,origname);

Error in gui_mainfcn (line 95)
        feval(varargin{:});

Error in test2 (line 42)
    gui_mainfcn(gui_State, varargin{:});

Error in
matlab.graphics.internal.figfile.FigFile/read>@(hObject,eventdata)test2('PickOne_Callback',hObject,eventdata,guidata(hObject))
Error while evaluating UIControl Callback.


Woran kann das liegen?
Private Nachricht senden Benutzer-Profile anzeigen
 
sijuherm
Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 01.08.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.08.2019, 11:58     Titel:
  Antworten mit Zitat      
Mit clickx habe ich eine Variable gemeint, die du definieren (und nach jeder Bildwahl hochzählen lassen musst). Diese wird sinnvollerweise in der handles-struct abgelegt.

Die Initialisierung machst du in der GUI_OpeningFcn:
Code:
handles.clickx = 0;


Und im Callback, welches ausgeführt wird, wenn du aufs Bild klickst (laut Code oben PickOne_Callback), zählst du hoch:
Code:
handles.clickx = handles.clickx + 1;


Du musst dir dann noch überlegen, ob und wann es Sinn macht, die Variable zurückzusetzen. Der Vollständigkeit halber: Dein Speicherbefehl sieht nun so aus:
Code:
savename = sprintf('Bild%i_%s',handles.clickx,origname);
Private Nachricht senden Benutzer-Profile anzeigen
 
Elyn44
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 09.07.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.08.2019, 12:57     Titel:
  Antworten mit Zitat      
@sijuherm Danke für deine schnelle Nachricht.

Ich verstehe. Sorry, dass ich nochmal so doof frage. Meinst du ich setze den handles.clickx in dem CommandLine Output oder in dem Update handles structure?

Code:
% --- Executes just before test2 is made visible.
function test2_OpeningFcn(hObject, eventdata, handles, varargin)

% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to test2 (see VARARGIN)

% Choose default command line output for test2
handles.output = hObject;
handles.clickx = 0;       <----- da?

% Update handles structure
guidata(hObject, handles);
handles.clickx = 0;        <--------- oder da?


Bei beiden Varianten bekomme ich eine Fehlermeldung sobald ich versuche auf die Bilder zu drücken.

Code:
Reference to non-existent field 'clickx'.

Error in test2>PickTwo_Callback (line 200)
handles.clickx = handles.clickx + 2;

Error in gui_mainfcn (line 95)
        feval(varargin{:});

Error in test2 (line 42)
    gui_mainfcn(gui_State, varargin{:});

Error in
matlab.graphics.internal.figfile.FigFile/read>@(hObject,eventdata)test2('PickTwo_Callback',hObject,eventdata,guidata(hObject))
Error while evaluating UIControl Callback.

Reference to non-existent field 'clickx'.

Error in test2>PickThree_Callback (line 219)
handles.clickx = handles.clickx + 3;

Error in gui_mainfcn (line 95)
        feval(varargin{:});

Error in test2 (line 42)
    gui_mainfcn(gui_State, varargin{:});

Error in
matlab.graphics.internal.figfile.FigFile/read>@(hObject,eventdata)test2('PickThree_Callback',hObject,eventdata,guidata(hObject))
Error while evaluating UIControl Callback.

Reference to non-existent field 'clickx'.

Error in test2>PickFour_Callback (line 239)
handles.clickx = handles.clickx + 4;

Error in gui_mainfcn (line 95)
        feval(varargin{:});

Error in test2 (line 42)
    gui_mainfcn(gui_State, varargin{:});

Error in
matlab.graphics.internal.figfile.FigFile/read>@(hObject,eventdata)test2('PickFour_Callback',hObject,eventdata,guidata(hObject))
Error while evaluating UIControl Callback.

Reference to non-existent field 'clickx'.

Error in test2>PickOne_Callback (line 180)
handles.clickx = handles.clickx + 1;

Error in gui_mainfcn (line 95)
        feval(varargin{:});

Error in test2 (line 42)
    gui_mainfcn(gui_State, varargin{:});

Error in
matlab.graphics.internal.figfile.FigFile/read>@(hObject,eventdata)test2('PickOne_Callback',hObject,eventdata,guidata(hObject))
Error while evaluating UIControl Callback.
Private Nachricht senden Benutzer-Profile anzeigen
 
sijuherm
Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 01.08.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.08.2019, 13:23     Titel:
  Antworten mit Zitat      
In der OpeningFcn solltest du das an der erster Stelle definieren, da es nach guidata(hObject, handles); keinen Effekt mehr hat (und dann zu deiner zitierten Fehlermeldung kommt). Das sollte jedoch bei der ersten Variante nicht passieren.

2 Punkte noch:
1. Update der handles struct in den Callbacks fehlt noch (hatte ich ursprünglich vergessen)
2. In jedem Callback solltest du nur 1 addieren, damit die Variable konstant hochzählt.

Code:
% --- Executes on button press in PickOne.
function PickOne_Callback(hObject, eventdata, handles)
% hObject    handle to PickOne (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
imh = findobj(handles.axes1, 'type', 'image');
image1 = get(imh, 'CData');
origname = imh.UserData;

%auf piktogramm erscheinen lassen
imshow(image1, 'Parent', handles.axes5)

%save to workspace
handles.clickx = handles.clickx + 1;
guidata(hObject, handles);
savename = sprintf('Bild%i_%s',handles.clickx,origname);
assignin('base','IR1', savename)


Versuch das nochmal aus, evtl. hilft ein clear all, da ich aktuell keinen Grund sehe, warum er clickx nicht findet.
Private Nachricht senden Benutzer-Profile anzeigen
 
Elyn44
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 09.07.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.08.2019, 14:51     Titel:
  Antworten mit Zitat      
@sijuherm

Vielen Lieben Dank, das hat super geklappt!
Ich habe noch eine ganz kleine Frage. Nachdem ich die Bilder gedrückt habe, möchte ich diese gerne mit einem "NEXT" Button speichern, zurücksetzen und mit einem neuen Datensatz, sprich eine neue Klickreihenfolge, fortsetzen.
Sowas wie ein Spiel, dass mehrere Runden durchläuft.

Mit welchen Befehl kann ich die Variablen zurücksetzen? Mein Code sieht gerade so aus für mein 'NEXT' Button:

Code:
% --- Executes on button press in pushbutton_next.
function pushbutton_next_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton_next (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
for i = 4
    run('test2');
    cla(handles.axes5);
    cla(handles.axes6);
    cla(handles.axes7);
    cla(handles.axes8);
end
Private Nachricht senden Benutzer-Profile anzeigen
 
sijuherm
Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 01.08.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.08.2019, 15:16     Titel:
  Antworten mit Zitat      
Welche Variablen möchtest du denn zurücksetzen? Wenns nur um den Klickzähler geht, dann einfach in deinem Callback des Next-Buttons den Wert auf 0 setzen:
Code:
handles.clickx = 0;
guidata(hObject, handles);


Wobei das unnötig wäre, wenn du die GUI neu aufmachst, wonach es bei deinem Codefragment aussieht. Mir ist auch die Funktion der Schleife (die eh nur einen Durchlauf hat und deren Laufvariable nirgends genutzt wird) schleierhaft. Im Endeffekt, kannst du einfach die GUI "neustarten", soweit ich das gesehen habe, werden die Daten direkt bei Aufruf der GUI geholt und nicht vorher schon erstellt und übergeben. Versuche das mal wie folgt:
Code:
% --- Executes on button press in pushbutton_next.
function pushbutton_next_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton_next (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
OrigDlgH = ancestor(hObject, 'figure');
delete(OrigDlgH);
test2; % Name deiner GUI
 


Falls das nicht klappt, dann bräuchte ich die Info, an welcher Stelle du die Bilder bestimmst und einbindest. Interessant wäre noch, was du mit den Variablennamen, die bei Klick auf die Bilder generiert werden, vor hast. Es werden mit jedem Durchlauf/Neustart der GUI neue Variablen mit dem gleichen Präfix angelegt, daher solltest du die vorher unter Umständen löschen. Am sinnvollsten in obigem Callback.
Private Nachricht senden Benutzer-Profile anzeigen
 
Elyn44
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 09.07.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.08.2019, 15:32     Titel:
  Antworten mit Zitat      
Ja genau es geht um den Klickzähler. Mein Problem ist, dass ich sie nach jeder Runde aus dem Workspace löschen, aber davor den Klickzähler auf eine Excel-Datei abspeichern möchte.

Die Schleife ist dafür da, dass ich die Bilder der Achsen 5 - Achsen 8 löschen kann, die der Anwender zuvor ausgesucht hat. (Die Bilder werden ja auf Achse 1 - Achse 4 angezeigt, der Anwender drückt auf die Bilder drauf und diese erscheinen auf den Achsen 5 - Achsen 8 als Kontrolle)

Die Bilder nehme ich mir aus vier verschiedenen Ordner mit den Namen IR1 - IR3 - IR4 und IR5. Sie werden zufällig ausgesucht

Code:
files = dir('/Users/Benutzer/Documents/MATLAB/IR1/**/*.dcm')
files = dir('/Users/Benutzer/Documents/MATLAB/IR3/**/*.dcm')
files = dir('/Users/Benutzer/Documents/MATLAB/IR4/**/*.dcm')
files = dir('/Users/Benutzer/Documents/MATLAB/IR5/**/*.dcm')


Die Bildnamen, die angeklickt werden, spielen deswegen ne große Rolle, weil ich diese später in einer Excel-Datei exportieren will um eine Statistik (größtenteils über die Klickreihenfolge) zu erstellen. Der Anwender sucht sich nämlich aus, welches Bild er quasi am schönsten findet.

Der Code funktioniert leider nicht, bzw wird die GUI zwar komplett neugestartet aber der workspace ändert sich nicht.
Private Nachricht senden Benutzer-Profile anzeigen
 
sijuherm
Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 01.08.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.08.2019, 16:03     Titel:
  Antworten mit Zitat      
Poste doch mal den Code der gesamten GUI, dann ist es einfacher dir zu helfen. Ich vermute mal, die Codezeilen stehen in der CreatFcn des jeweiligen axes-Objects. Was auch (vor allem für dich) interessant wäre:
1. Was ist der Nutzen der angelegten Variablen? Wenn du nur die Klickreihenfolge der Bilder später ins Excel exportieren willst, brauchst du dafür nicht mehrere Variablen anlegen. Das abspeichern in Excel kannst du dann z.B. in der GUI-ClosingFcn erledigen.
2. Wie soll die Handhabung der GUI sein, z.B. was passiert, wenn der Nutzer ein Bild anklickt? Eine Kopie wandert in eine "Kontrollstruktur" (an welche Stelle hier?). Soll aber das Bild erneut klickbar sein, d.h. ist es möglich 4x das gleiche Bild anzuklicken? Oder soll jedes Bild nur einmal klickbar sein (dann macht es evtl. Sinn das Bild auszublenden o.ä.). Was passiert, wenn man 5x oder öfters klickt. Wenn ausschließlich du das nutzt ist das weniger ein Problem, als wenn das andere (unwissende) benutzen sollen. Evtl. ist es sinnvoll eine Art "Reset"-Funktion einzubauen, falls man sich verklickt.

Da ist noch nichtmal an alles gedacht und geht weit über deine Fragestellung hinaus. Daher nur als Anregung, da es in der Regel einfacher ist, erstmal ein Gesamtkonzept zu haben, anstatt stückchenweise Erweiterungen dazu zu bauen.

Zur Anmerkung dass der Workspace sich nicht ändert: Was stört dich daran? Und was spricht dagegen, dass die GUI erneut geöffnet wird (mit mutmaßlich neuen Bildern). Das war doch das Ziel, wenn ich das richtig verstanden habe.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



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.