2017-09-28 5 views
0

Ich bereite eine GUI vor, in der die Sichtbarkeit von Plots durch Auswahl der Kontrollkästchen in zwei verschiedenen Achsen gesteuert wird. Zusätzlich sollte der Benutzer den Y-Vektor aus einem Popup-Menü auswählen. Der Code funktioniert gut (es könnte eleganter sein), aber ich habe Probleme beim automatischen Aktualisieren des Plots. Derzeit, wenn ich plotte und anschließend eine andere Y-Werte aus dem Popup-Menü auswähle, muss ich das Häkchen für die Änderungen in der Handlung deaktivieren und erneut ankreuzen. Wie kann ich die GUI automatisch aktualisieren, wenn sie ausgewählt ist (Häkchen). Jede Hilfe ist sehr geschätzt:Kontinuierliche Aktualisierung der grafischen Darstellung der Benutzeroberfläche

Hier ist mein Code:

 % --- Executes on pushbutton1. 
    function pushbutton1_Callback(hObject, eventdata, handles) 
    X=[1 2 3 4] 
    Y1=[10 20 30 40] 
    Y2=[-1 -2 -3 -4] 
    handles.X=X; 
    handles.Y1=Y1; 
    handles.Y2=Y2; 
    guidata(gcbo, handles); 
    UnitFcn(handles) 



    % --- checkbox function on/off 
    function C = OnOffStr(D) 
    OffOn = {'off', 'on'}; 
    L  = (D ~= 0) + 1; % 0/FALSE => 1, anything else => 2 
    if length(L) == 1 
    C = OffOn{L}; % Reply a string 
    else 
    C = OffOn(L); % Reply a cell string 
    end 



    function UnitFcn(handles) 
    Y1=handles.Y1; 

    for p = 1:numel(plotdata) 

     Unit = get(handles.popupmenu1,'Value'); 
     if (Unit==1) 
     Y(:,p)=Y1(:,p); 

     elseif (Unit==2)% 
     Y(:,p)=Y1(:,p)*100; 

     end   
    end 

    handles.Y=Y; 
    guidata(gcbo, handles); 
    PlotFcn(handles) 



    function PlotFcn(handles) 
    X=handles.X; 
    Y=handles.Y; 
    Z=handles.Y2; 

    %Plot in Axes 1 
    set(handles.axes1, 'NextPlot', 'add'); 
     handles.plot1 = plot(X,Y,'visible','off','LineWidth',2, ... 
           'color', [0 0 0],'linestyle', '--', 'parent', handles.axes1);  

    %Plot in Axes 2 
    set(handles.axes2, 'NextPlot', 'add');  
     handles.plot2 = plot(X,Y2,'visible','off','LineWidth',2, ... 
           'color', [0 0 0],'linestyle', '--', 'parent', handles.axes2); 

    guidata(gcbo, handles); 



    % --- Executes on button press in checkbox1. 
    function checkbox1_Callback(hObject, eventdata, handles) 
    set(handles.plot1, 'Visible', OnOffStr(get(hObject,'Value'))); 


    % --- Executes on button press in checkbox1. 
    function checkbox1_Callback(hObject, eventdata, handles) 
    set(handles.plot2, 'Visible', OnOffStr(get(hObject,'Value'))); 



    % --- Specify unit in popupmenu1. 
    function popupmenu1_Callback(hObject, eventdata, handles) 
    UnitFcn(handles) 

    function popupmenu1_CreateFcn(hObject, eventdata, handles) 
    if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) 
     set(hObject,'BackgroundColor','white'); 
    end 

Dies ist ein vereinfachter Code und die "für p = 1: numel (PlotData)" beziehen sich auf eine Matrix, wo ich ~ 30 verschiedene Grundstücke.

Antwort

0

Ich kann es lösen, wenn ich diesen Code in der PlotFcn gehören:

for i=1:1:numel(X(1,:)) 
Checked(i,1) = get(handles.(sprintf('checkbox%d',i)),'value'); 
if (Checked(i,1)==1) 
    set(handles.plot(i), 'Visible', 'on') 
    set(handles.plot(i), 'Visible', 'on') 
end 
end 

aber ich bin nicht sicher, ob dies die beste Lösung ist ?? Es dauert einige Zeit, 30 Parzellen mit diesem Code auszuführen.

Verwandte Themen