Verfasst am: 16.07.2015, 15:41
Titel: Verkettung von Körpertransformationen im GUI
Hallo zusammen,
ich muss für den Leistungsnachweis in der Uni eine GUI erstellen, in der verschiedene Körper (Quader, Pyramide, etc.) per Radiobuttonauswahl angezeigt werden. In einer anderen Buttongroup gibt es dann mehrere Radiobutton für folgende Transformationen:
Verschiebung in X,Y,Z Richtung
Rotation um X,Y,Z Achse
Skalierung
Das anzeigen und transformieren der Körper funktioniert soweit. Nun soll eine Checkbox eignefügt werden, bei dessen Betätigung die Transformationen verkettet werden, d.h. z.B. erst eine Verschiebung, dann den verschobenen Körper rotieren und diesen verschobenen und rotierten Körper dann noch skalieren. Das alle wird live im Grafikfenster angezeigt, die Steuerung der Transformationen erfolgt über einen Slider.
Diese Verkettung funktioniert leider nicht. Kann mir hier jemand helfen?
% --- Executes when selected object is changed in bg_selbody. function bg_selbody_SelectionChangeFcn(hObject, eventdata, handles) % hObject handle to the selected object in bg_selbody % eventdata structure with the following fields (see UIBUTTONGROUP) % EventName: string 'SelectionChanged' (read only) % OldValue: handle of the previously selected object or empty if none % was selected % NewValue: handle of the currently selected object % handles structure with handles and user data (see GUIDATA)
global b body_rb r n; % globale Variablen im gesamten GUI, % sonst nur in einzelnen Funktionen
% Festhalten welcher RB gedrückt ist
body_rb=get(eventdata.NewValue,'Tag');
% Reaktion in Abhängigkeit von gedrücktem Radioknopf switch body_rb
case'rb_quader' % Radiobutton: Quader
b=quader(10,20,30); % Quaderfunktion figure(1)% Öffnen Grafikfenster clf; % Löschen des Inhalts des Grafikfensters
show(b,100); % Anzeigen von Körper b
case'rb_pyramide' % Radiobutton Pyramide
b=pyramide(30,20); % Pyramidenfunktion figure(1)% Öffnen Grafikfenster clf; % Löschen des Inhalts des Grafikfensters
show(b,100); % Anzeigen von Körper b
case'rb_oktaeder' % Radiobutton Oktaeder
b=oktaeder(30); % Oktaederfunktion figure(1)% Öffnen Grafikfenster clf; % Löschen des Inhalts des Grafikfensters
show(b,100); % Anzeigen von Körper b
case'rb_kiste' % Radiobutton Kiste
b=kiste(20,15,30); % Kistenfunktion figure(1)% Öffnen Grafikfenster clf; % Löschen des Inhalts des Grafikfensters
show(b,100); % Anzeigen von Körper b
case'rb_einlesen' % Radiobutton Datein einlesen
b=read_wire(datnam); % Einlesefunktion, nicht funktionsfähig
case'rb_zylinder' % Radiobutton Zylinder figure(1)% Öffnen Grafikfenster clf; % Löschen des Inhalts des Grafikfensters cylinder(r,n); % Befehl zur Zylindererstellung
% r und n aus Edit Textfeldern (siehe ganz unten)
% Zylinder nicht transformierbar, da % 'cylinder' fertige Matlab-Datei und % nicht in 'b' gespeicher werden kann % (Transformationen laufen aber nur über % 'b') otherwise disp('Körper nicht bekannt') end; % Switch
% --- Executes on button press in cb_verk. function cb_verk_Callback(hObject, eventdata, handles) % hObject handle to cb_verk (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of cb_verk
global verk; % globale Variablen im gesamten GUI, % sonst nur in einzelnen Funktionen
verk=get(hObject,'Value') ; % Eigentliche Verkettungsfunktion, % funktioniert nicht
% % --- Executes during object creation, after setting all properties. % function bg_trans_CreateFcn(hObject, eventdata, handles) % % hObject handle to bg_trans (see GCBO) % % eventdata reserved - to be defined in a future version of MATLAB % % handles empty - handles not created until after all CreateFcns % % called % set(hObject,'SelectionChangeFcn',@trans); % % Update handles structure % guidata(hObject, handles);
% --- Executes when selected object is changed in bg_trans. function bg_trans_SelectionChangeFcn(hObject, eventdata, handles) % hObject handle to the selected object in bg_trans % eventdata structure with the following fields (see UIBUTTONGROUP) % EventName: string 'SelectionChanged' (read only) % OldValue: handle of the previously selected object or empty if none % was selected % NewValue: handle of the currently selected object % handles structure with handles and user data (see GUIDATA)
global trans_rb; % globale Variablen im gesamten GUI, % sonst nur in einzelnen Funktionen
% Festhalten welcher Radioknopf gedrück wird
trans_rb=get(eventdata.NewValue,'Tag');
% Reaktion in Abhängigkeit vom gedrückten Radiobutton switch trans_rb % Switch-Schleife zur Unterscheidung % der Radiobuttons
case'rb_transx' % RB: X-Verschiebung disp('Verschiebung in X-Richtung')% Textausgabe
case'rb_transy' % RB: Y-Verschiebung disp('Verschiebung in Y-Richtung')% Textausgabe
case'rb_transz' % RB: Z-Verschiebung disp('Verschiebung in Z-Richtung')% Textausgabe
case'rb_rotx' % RB: X-Rotation disp('Rotation um X-Achse')% Textausgabe
case'rb_roty' % RB: Y-Rotation disp('Rotation um Y-Achse')% Textausgabe
case'rb_rotz' % RB: Z-Rotation disp('Rotation um Z-Achse')% Textausgabe
% ========== Durchführung der Translationen mit dem Slider ==============
% --- Executes on slider movement. function slider2_Callback(hObject, eventdata, handles) % hObject handle to slider2 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'Value') returns position of slider % get(hObject,'Min') and get(hObject,'Max') to determine range of % slider
% --- Executes during object creation, after setting all properties. function slider2_CreateFcn(hObject, eventdata, handles) % hObject handle to slider2 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called
% Hint: slider controls usually have a light gray background.
% Hintergrundfarbe Slider: ifisequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor',[.9 .9 .9]);
end
% Wichtig, damit die Slider-Änderungen direkt angezeigt werden:
addlistener(hObject,'Action',@slider);
function slider(hObject,eventdate,handles) global b bb trans_rb ; % globale Variablen im gesamten GUI, % sonst nur in einzelnen Funktionen
fac=get(hObject,'Value'); % Holen des Sliderwwertes (fac)
ST=[num2str(fac*360),'grad']; % Umrechnung fac in Grad zur % Anzeige bei Rotationen switch trans_rb % Switch-Schleife zur % Unterscheidung der RB case 'rb_transx' % Fall: Verschiedung in X-Richtung
bb=trnsl(b,fac*50,0,0); % Funktion
show(bb,100)% Anzeige % set(handles.st_transx,'String',num2str(fac)); case 'rb_transy' % Fall: Verschiedung in Y-Richtung
bb=trnsl(b,0,fac*50,0); % Funktion
show(bb,100)% Anzeige % set(handles.st_transy,'String',num2str(fac*10));
case 'rb_transz' % Fall: Verschiedung in Z-Richtung
bb=trnsl(b,0,0,fac*50); % Funktion
show(bb,100)% Anzeige % set(handles.st_transz,'String',num2str(fac*10));
case 'rb_rotx' % Fall: Rotation in X-Richtung
bb=rot(b,'X',fac*360); % Funktion
show(bb,100)% Anzeige % set(handles.st_rotx,'String',ST);
case 'rb_roty' % Fall: Rotation in Y-Richtung
bb=rot(b,'Y',fac*360); % Funktion
show(bb,100)% Anzeige % set(handles.st_roty,'String',ST);
case 'rb_rotz' % Fall: Rotation in Z-Richtung
bb=rot(b,'Z',fac*360); % Funktion
show(bb,100)% Anzeige % set(handles.st_rotz,'String',ST);
% Auskommentierte Set-Befehle: Dienen eigentlich zur dauerhaften % Aktualisierung der Static-Textfelder, damit der Sliderwert beim % zugehörigen Radiobutton direkt angezeigt wird. Funktioniert leider % überhaupt nicht und führt zum vollständigen Ausfall der % Transformationen!
% --- Executes on button press in cb_verk. function cb_verk_Callback(hObject, eventdata, handles) % hObject handle to cb_verk (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of cb_verk
global verk; % globale Variablen im gesamten GUI, % sonst nur in einzelnen Funktionen
verk=get(hObject,'Value') ; % Eigentliche Verkettungsfunktion, % funktioniert nicht
Den Abschnitt habe ich vorhin schon gefunden. Und dass das keine Fehlermeldung gibt, sehe ich auch. Das liegt im vor allem daran, dass dort kein Code steht :)
Welche Art von Hilfe erwartest Du denn nun? Dass hier jemand die Transformationsgleichungen herleitet und aufschreibt, wie man sie in Deinem speziellen Fall in Matlab implementiert? Oder fehlt Dir das grundsätzliche Wissen darüber, wie man überhaupt irgendwas programmiert? Oder hapert es womöglich an der GUI? Deine Fragestellung ist wirklich sehr, sehr offen, so dass man leider nicht so richtig weiß, was Dein Problem ist.
Wie können wir Dir zur Zeit konkret helfen?
Wir haben die Informationen, dass Du eine "Verkettung" bekommen möchtest, aber keinen Code dazu. Da es sich um einen Leistungsnachweis von Dir handelt, können wir das nicht einfach für Dich lösen, aber konkrete Fragen könnten wir schon beantworten.
Das Speichern aktueller Werte in
global
's ist eine schlechte Idee. Die GUI wäre dafür viel besser geeignet, siehe
setappdata
oder
guidata
. Wenn einer meiner Studenten auf globale Variablen setzen würde, wäre das für mich ein klares Zeichen dafür, dass er noch ein ausschöpfbares Potential für das Erlernen guter Programmier-Techniken hat.
Du kannst hier im Forum sehr viele Threads zum Thema globale Variablen und bessere Methoden finden.
Gruß, Jan
Einstellungen und Berechtigungen
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
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.