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

Verkettung von Körpertransformationen im GUI

 

Student1287923

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.07.2015, 15:41     Titel: Verkettung von Körpertransformationen im GUI
  Antworten mit Zitat      
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?

Hier mein Code vom GUI:

Code:
% ========================== eigentliche Körperauswahl ================


% --- 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



% ======================== Verkettungsfunktion ==========================

% --- 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


% ======================= Transformationsauswahl ========================


% % --- 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
       
    case'rb_skal'                             % RB: Skalierung
        disp ('Körper skalieren')             % Textausgabe
       
    otherwise
        disp ('Funktion nicht bekannt')
       
               % Textausgabe zur Sicherheit, damit Benutzer weiß ob Knopf
               % wirklich gedrückt wurde!
       
end % Switch


% ========== 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:
if isequal(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);

% Update handles structure
guidata(hObject,handles);

% Eigentliche Sliderfunktion
% Aufruf erfolgt mit Addlistener (hObject,'Action',@slider) (siehe oben)

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);
         
    case 'rb_skal'                      % Fall: Skalierung
         bb=skal(b,fac*4);              % Funktion
         show(bb,100)                   % Anzeige
         % set(handles.st_transz,'String',num2str(fac*2));
         
  % 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!
         
    otherwise
        disp('Fehler!');
end;                                        % Switch


Danke im Vorraus!


Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.07.2015, 15:54     Titel:
  Antworten mit Zitat      
Wenn Du den Code für die Berechnung der Verkettung hier nicht postest, ist es schwer zu sagen, was da nicht funktioniert.

Und was bedeutet denn Funktioniert nicht? Gibt es eine Fehlermeldung? Wenn ja, welche?
Private Nachricht senden Benutzer-Profile anzeigen
 
Student1287923

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.07.2015, 16:01     Titel:
  Antworten mit Zitat      
Sorry, ich dachte der wird da schnell gefunden. Habe leider nicht besonder viel hinbekommen:

Code:
% ======================== Verkettungsfunktion ==========================

% --- 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


Fehlermeldungen kommen keine. Bin leider total hilflos was das Thema angeht..
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.07.2015, 16:11     Titel:
  Antworten mit Zitat      
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.

tl;dr: konkrete Fragen <=> konkrete Antworten
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 19.07.2015, 13:06     Titel:
  Antworten mit Zitat      
Hallo Student1287923,

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
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.