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

Data Cursor mit senkrechter Linie

 

ka404
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 95
Anmeldedatum: 29.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.09.2013, 09:33     Titel: Data Cursor mit senkrechter Linie
  Antworten mit Zitat      
Hallo,

Mein Pogramm läuft zur Zeit so :
Mit Hilfe des Data Cursor klicke ich auf die dargestellte Kurve die in meinem Koordinatensystem geplottet wurde, mit Hilfe eines Buttons kann ich die x-Koordinate vom ausgewahlten Punkt der Kurve abspeichern in die angewählte Zelle einer Tabelle , wähle ich nun eine andere Zelle der Tabelle aus und wähle mit dem Data Cursor einen anderen Punkt aus so kann ich diesen auch mittels des Buttons abspeichern.

Dies geschieht bisher in dieser Callback- Funktion des Buttons:

Code:
function Messpunktspeichern_Callback(hObject, eventdata, handles)

 handles.dcm_obj = datacursormode;   % Einschalten datacursormode und  Objektname
info_struct = getCursorInfo(handles.dcm_obj);
               % Strukturvariable, erhält Cursor-Info
                   
p = info_struct.Position;   % geeignete Variable x erhält Cursorposition


[a,b]=size(handles.xy);            % Zeilen-, Spaltenzahl
if  (a*b)~=0                        % nur wenn Tabellenzelle ausgewählt
                                    % sonst Zeilenzahl Null
    c = handles.xy(1,1);
    d = handles.xy(1,2);
   
    if (c*d)~=0                     % nur wenn nicht Index 0,0 (Start)
        TabInhalt = get(handles.tabelle,'Data'); % Tabelle auslesen
        TabInhalt(c,d) = p(1);      % hier dann x - Wert von datacursor
        set(handles.tabelle,'Data',TabInhalt); %Tabelle neu schreiben
    end
end

Ich würde dies nun gern erweitern.....
jeder angewählte Punkt mit dem Datacursor wird durch eine senkrechte grüne Linien deutlich gemacht.
Dieser Wert soll nun auch wie zuvor in der Tabelle gespeichert werden, dies ist dann der Anfangswert von einem bestimmt Bereich. Ohne das diese grüne senkrechte Linie verschwindet soll eine zweite senkrechte grüne Linie gesetzt werden, und wiederum der Wert gespeichert werden also der Endwert des Bereichs, sodass der ausgewählte Bereich zwischen den zwei grünen Linien grafisch schön ersichtlich ist.

Hat jemand einen Vorschlag wie ich das lösen könnte?
ich könnte auch die m-File und die fig-Datei mal hier hinzufügen falls nötig.

Vielen Dank im Voraus

[EDITED, Jan, Bitte Code-Umgebung benutzen - Danke!]
Private Nachricht senden Benutzer-Profile anzeigen


ka404
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 95
Anmeldedatum: 29.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.09.2013, 11:14     Titel:
  Antworten mit Zitat      
Hallo,

ich glaub mein Problem ist ein wenig zu komplex oder?
Kann mir denn jemand wenigstens sagen wie ich erstmal so eine senkrechte grüne Linie durch den Datacursor erzeuge?

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 19.09.2013, 12:33     Titel:
  Antworten mit Zitat      
Hallo

Position des Punkts hast du doch bereits ?
jetzt hole dir YLim Propertiy aus Axis, um die Start- und End-Punkte rauszufinden. Und dann mit LINE deine senkrechte Linie zeichnen.

so in die Richtung:
Code:

figure();
plot(1:10)
% Z.B für den Punkt
p = [1.5 , 1.5]
x = p(1)
ylimits =get(gca,'YLim')
ymin   = ylimits(1)
ymax  = ylimits(2)
line([x, x], [ymin, ymax])

 
Private Nachricht senden Benutzer-Profile anzeigen
 
ka404
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 95
Anmeldedatum: 29.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.10.2013, 17:32     Titel:
  Antworten mit Zitat      
Danke das funktioniert super mit der Linie Wink

nun möchte ich aber wenn ich eine Änderung in der Tabelle vornehme, sollen die gesetzen Cursorlinien gelöscht werden und neu gesetzt werden an der jeweiligen Stelle was neu in die Tabelle geschrieben wurde.

Geht das mit der CellEditCallback(hObject, eventdata, handles) - Funktion der Tabelle? dort wird doch erkannt wenn der User eine Änderung in der Tabelle vornimmt richtig?

Leider bekomme ich es einfach nicht hin die gesetzten Cursorlinien zu löschen und neue zu Setzen....

Grüße

Ka404
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 16.10.2013, 09:53     Titel:
  Antworten mit Zitat      
Hallo

da musst du dir das Handle der Linie merken. Lege dazu die Linie in deine Handles-Struktur ab. GUIDATA/ SETAPPDATA

Löschen ist nicht immer die beste Wahl, also besser wenn du die Position der Linie modifizierst, das läuft schneller als löschen:
Code:

handles =[];
h = figure();
plot(1:10)
% Z.B für den Punkt

for k=1:100
  p = randi(10, 1,2)
  x = p(1)
  ylimits =get(gca,'YLim')
  ymin   = ylimits(1)
  ymax  = ylimits(2)

  if ~isfield(handles, 'cursor')
      handles.cursor= line([x, x], [ymin, ymax]);
  else
      set(handles.cursor, 'XData' , [x, x]);
  end
 
pause(1)
end

 
Private Nachricht senden Benutzer-Profile anzeigen
 
ka404
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 95
Anmeldedatum: 29.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.10.2013, 10:37     Titel:
  Antworten mit Zitat      
Hallo,

Ich hab da noch ne Frage schreibe ich das jetz in die normale Callback funktion oder in die CellEditCallback(hObject, eventdata, handles) - Funktion der Tabelle ?

und was bedeutet GUIDATA/ SETAPPDATA ?

grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 16.10.2013, 13:36     Titel:
  Antworten mit Zitat      
Ja, man könnte dies auch in CellEditCallback machen.

GUIDATA ist zu temporären Speichern der Handles da, um die Daten zwischen Callbacks weiterzugeben.

SETAPPDATA/GETAPPDATA ist mehr für eigene Daten vorgesehen, aber schaue dir die Doku an

und noch folgende Beispiele dazu:

http://blogs.mathworks.com/videos/2.....ithout-globals-in-matlab/

http://blogs.mathworks.com/videos/2...../03/guide-video-part-two/
Private Nachricht senden Benutzer-Profile anzeigen
 
ka404
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 95
Anmeldedatum: 29.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.10.2013, 21:53     Titel:
  Antworten mit Zitat      
Hallo,

Da ich mehrere Cursor Linien setzen möchte in Abhängigkeit von der Variable a setzten möchte, möchte ich das ganze mit einer Schleife realisieren nur leider funktioniert sie nicht ....

bisher hatte ich es so für 2 Cursor-linien da aber noch mehr hinkommen bräuchte ich diese Schleife:

Code:
     if (handles.xy(1,1)==1)
        x1 = p(1);
   
        ylimits =get(gca,'YLim');
        y1  = ylimits(1);
        y2  = ylimits(2);
       
     if ~isfield(handles, 'cursor1')
         handles.cursor1= line([x1, x1], [y1, y2],'Color','g') ; % grüne Cursorlinie setzen
     else
          set(handles.cursor1, 'XData' , [x1, x1]);
     end
   
     pause(1)
        end  
     
       
     if (handles.xy(1,1)==2)
     x2 =p(1);
    ylimits =get(gca,'YLim');
    y1  = ylimits(1);
    y2  = ylimits(2);
 
     if ~isfield(handles, 'cursor2')
         handles.cursor2= line([x2, x2], [y1, y2],'Color','g') ; % grüne Cursorlinie setzen
     else
          set(handles.cursor2, 'XData' , [x2, x2]);
     end
     pause(1)
     end


und wollte es so realisieren was aber leider nicht funktioniert:

Code:
   for k=1:a
       if (handles.xy(1,1)==1)
        x1(k) = p(1);
        ylimits =get(gca,'YLim');
        y1  = ylimits(1);
        y2  = ylimits(2);
       
     if ~isfield(handles, 'cursor2')
         handles.cursor2(k)= line([x1(k), x1(k)], [y1, y2],'Color','g') ; % grüne Cursorlinie setzen
     else
          set(handles.cursor2(k), 'XData' , [x1(k), x1(k)]);
     end
   
     pause(1)
        end  
        end


kann mir jemand bitte helfen?

Grüße
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: 28.10.2013, 23:39     Titel:
  Antworten mit Zitat      
Hallo ka404,

Zitat:
und wollte es so realisieren was aber leider nicht funktioniert:

Bitte erkläre noch was "nicht funktioniert" genau bedeutet. Gibt es eine Fehlermeldung oder stimmt das Ergebnis nicht mit Deinen Erwartungen überein?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
ka404
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 95
Anmeldedatum: 29.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.10.2013, 10:49     Titel:
  Antworten mit Zitat      
Hallo Jan,
ja es gibt eine Fehlermeldung:

Zitat:
Attempt to reference field of non-structure array.

Error in set_ber8>Schliessen_Callback (line 323)
handles.output1 = get(handles.tabelle,'Data'); % Übernahme
Tabelle

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

Error in set_ber8 (line 43)
gui_mainfcn(gui_State, varargin{:});

Error in
@(hObject,eventdata)set_ber8('Schliessen_Callback',hObject,eventdata,guidata(hObject))


Error using waitfor
Error while evaluating uicontrol Callback


Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 29.10.2013, 11:39     Titel:
  Antworten mit Zitat      
Hallo ka404

Du solltest einwenig dein Code beschreiben,
mir ist z.B nicht klar was deine Anweisungen bedeuten


Deine 2. IF-Anweisung in FOR-Loop muss anders lauten,
sonst greifst auf die Array-Elemente, welche noch nicht existieren.

passe deine Schleife wie folgt:
Code:


% Initialisieren vor der Schelife
if ~isfield(handles, 'cursor2')
   handles.cursor2 = nan(1,a);
end


% hier muss Variable a, doch der Länge des handles entsprechen?
for k = 1:length(handles.cursor2)

   % das mir nicht klar, was hier passiert
   if (handles.xy(1,1)==1)
      x1(k)   = p(1);
      ylimits = get(gca,'YLim');
      y1      = ylimits(1);
      y2      = ylimits(2);
     

      % hier prüfen, ob das handle existiert
       % wenn nicht => erzeuge neu Linie, sonst verändere die Position
      if ~ishandle(handles.cursor2(k))
         handles.cursor2(k)= line([x1(k), x1(k)], [y1, y2],'Color','g') ; % grüne Cursorlinie setzen
      else
         set(handles.cursor2(k), 'XData' , [x1(k), x1(k)]);
      end
     
      pause(1)
   end
end

 
Private Nachricht senden Benutzer-Profile anzeigen
 
ka404
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 95
Anmeldedatum: 29.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.10.2013, 13:10     Titel:
  Antworten mit Zitat      
Hallo,

ok ich versuche noch einmal alles deutlicher zu beschreiben die Schleife soll in Abhängigkeit von der Variablen a sein, die der Benutzer von Hand in eine Editor Fenster beliebig eingeben kann, die variable a hole ich mit dem Befehl :
Code:
a = str2double(get(hObject,'String'));


es handelt sich dabei um eine natürliche Zahl.

Code:
 for k=1:a    
       if (handles.xy(1,1)==1)  % soll nur passieren wenn die erste Zeile in einer Tabelle ausgewählt ist
        x1(k) = p(1);   % p(1) ist der x-Wert der Cursorposition
        ylimits =get(gca,'YLim');
        y1  = ylimits(1);
        y2  = ylimits(2);
       
     if ~isfield(handles, 'cursor2')
         handles.cursor2(k)= line([x1(k), x1(k)], [y1, y2],'Color','g') ; % grüne Cursorlinie setzen
     else
          set(handles.cursor2(k), 'XData' , [x1(k), x1(k)]);
     end
   
     pause(1)
        end  
        end
 



im Editor wird die Variable x(1) rot unterstrichen .... wenn ich mit der Maus darüber fahre steht dort:
Zitat:
Explanation
The size of the indicated variable or array appears to be changing with each loop iteration. Commonly, this message appears because an array is growing by assignment or concatenation. Growing an array by assignment or concatenation can be expensive. For large arrays, MATLAB must allocate a new block of memory and copy the older array contents to the new array as it makes each assignment. Programs that change a variable's size in this way can spend most of their run time in this inefficient activity.
For the same reasons, there is significant overhead in shrinking an array or in changing the size of a variable on each iteration.
Suggested Action
Consider preallocating a variable or array before entering the loop by using zeros, ones, cell, or a similar function. Preallocating avoids the need for MATLAB to copy the data from one array to another inside the loop. For examples of code that do and do not preallocate an array, see “Preallocating Arrays”.
When an array grows by assigning past the end of the array or by using concatenation, preallocation alone does not improve the performance. The code must also use explicit indices.
If you do not know the size of an array before the loop begins, preallocate it, and then if necessary, shrink it after the loop completes.
Consider preallocating a variable or array before entering the loop by using zeros, ones, cell, or a similar function. Preallocating avoids the need for MATLAB to copy the data from one array to another inside the loop. For examples of code that do and do not preallocate an array, see “Preallocating Arrays”.
When an array grows by assigning past the end of the array or by using concatenation, preallocation alone does not improve the performance. The code must also use explicit indices.
If you do not know the size of an array before the loop begins, preallocate it, and then if necessary, shrink it after the loop completes....

If any of the following conditions are true, it might be appropriate to suppress this message, as described in Adjust Code Analyzer Message Indicators and Messages:
The loop code contains a conditional block where the array grows. (In this case, it can be reasonable to grow the array only as the loop finds such conditions.)
For each iteration in the loop, the length of the concatenation varies (such as strings with variable length). The total size of the array is not calculable before entering the loop.
The array is small and will remain small; therefore, the impact of recopying is also small.
The code preallocates the array, but in a way that Code Analyzer does not recognize.


mein englisch ist nicht sehr gut....
hilft das weiter oder soll ich noch mehr details erklären, was passieren soll im Programm?
Private Nachricht senden Benutzer-Profile anzeigen
 
ka404
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 95
Anmeldedatum: 29.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.10.2013, 14:23     Titel:
  Antworten mit Zitat      
Hallo nochmal,

was bedeutet diese Fehlermeldung:

Zitat:
Error using nan
NaN and Inf not allowed.

Error in set_ber9>Messpunktspeichern_Callback (line 261)
handles.cursor2 = nan (1,a);

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

Error in set_ber9 (line 43)
gui_mainfcn(gui_State, varargin{:});

Error in
@(hObject,eventdata)set_ber9('Messpunktspeichern_Callback',hObject,eventdata,guidata(hObject))


Error using waitfor
Error while evaluating uicontrol Callback


kann ich nan hier nicht verwenden?

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 01.11.2013, 00:52     Titel:
  Antworten mit Zitat      
Hallo

Es liegt wohl an WAITFOR, vermutlich wartest auf den Wert von diesem Feld, und deswegen darf kein NAN dort sein, na ja da kenne ich keine Lösung.
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 - 2025 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.