Verfasst am: 18.09.2013, 09:33
Titel: Data Cursor mit senkrechter Linie
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)
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.
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?
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])
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....
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 ?
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:
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
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 :
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
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?
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.
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.