Forum: PC-Programmierung VisualStudio2022, C#8, WPF, XAML Messkurven als Diagramm darstellen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Gunnar F. (gufi36)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich soll eine Software schreiben, die Spektrogramme darstellt, so 
ähnlich wie im angehängten Bild. Dass der Hintergrund schwarz und die 
X-Achse "spektral richtig" unter der Kurve dargestellt wird, ist derzeit 
Kür, aber keine Pflicht.
Den Treiber und die Form habe ich schon zusammen. Die spektrale 
Verteilung wird mir in einem Array von 10...500 Float-Werten zurück 
gegeben.
Wer kann mir empfehlen, wie man so ein Funktionsdiagramm darstellt? 
Bisher kenne ich natürlich das Canvas, kann da reinzeichnen und Linien 
(Achsen oder Y-Balken) zeichnen. Aber wenn ich eine Achsenteilung mit 
gestrichelten Hilfslinien und Achsenbeschriftung machen will, wird das 
sehr aufwendig.
Ich habe schon viel recherchiert, noch wenig gefunden, aber das läuft 
auf freie AddOns hin, die ich irgendwo bei NuGet laden und nutzen kann.
Viele von den ganzen Tipps auf Stackoverflow sind aber schon sehr alt.
Ich hätte gerne von euch eine Empfehlung, was der Profi da heute 
verwendet?
Vielen Dank im Voraus!
Gruß Gunnar

von Franko S. (frank_s866)


Lesenswert?

Gunnar F. schrieb:
> (Achsen oder Y-Balken) zeichnen. Aber wenn ich eine Achsenteilung mit
> gestrichelten Hilfslinien und Achsenbeschriftung machen will, wird das
> sehr aufwendig.
Na wenn das schon aufwendig für dich ist, dann empfehle ich eine 
Umschulung zum Strassenkehrer.

von Martin S. (sirnails)


Lesenswert?

Gunnar F. schrieb:
> Ich hätte gerne von euch eine Empfehlung, was der Profi da heute
> verwendet?

Gibt eine ganze Palette:

https://plotly.com/csharp/
https://scottplot.net/
https://www.nuget.org/packages/QuikGraph

Selber zeichnen geht auch, ist aber zumeist wenig performant.

Franko S. schrieb:
> Na wenn das schon aufwendig für dich ist, dann empfehle ich eine
> Umschulung zum Strassenkehrer.

Cool, mein erster Kandidat für mein Greasemonkey Ignorelist Script.

von Jörg (lixtop)


Lesenswert?

Und wo ist das Problem?

Das ist als wenn Du 1, 2 oder mehrere Bitmaps in der gleichen Auflösung 
zeichnest und im Anschluß diese übereinanderlegst. Dazu braucht es doch 
keine
"freie AddOns", oder?

von Martin S. (sirnails)


Lesenswert?

Jörg schrieb:
> Das ist als wenn Du 1, 2 oder mehrere Bitmaps in der gleichen Auflösung
> zeichnest und im Anschluß diese übereinanderlegst.

Das Zeichnen ist - auf Deutsch - eine sau Arbeit und führt selten zu 
besseren Ergebnissen.

Warum das Rad ständig neu erfinden?

von Gunnar F. (gufi36)


Lesenswert?

Martin S. schrieb:
> Das Zeichnen ist - auf Deutsch - eine sau Arbeit und führt selten zu
> besseren Ergebnissen.

Vielen Dank, Martin!
Die Pakete sehe ich mir gerne mal an, bin gespannt.

@Franko
Ich habe schon vor 30 Jahren unter QBasic Graphen programmiert. Und da 
die Textelemente in vertikaler Ausrichtung, gestrichelte Linien im 
Hauptraster, kleine Tags im Unterraster, das war schon eine Viecherei. 
Das ganze in einem Canvas, dessen tatsächlichen Ausmaße sich permanent 
ändern können, also dauernd Systemkoordinaten in lokale Koordinaten 
umrechnen, auf Ereignisse reagieren... Puh..
Freut mich aber, auch von einem solchen Profi wie Dir was lernen zu 
dürfen!

von Bertram S. (bschall)


Angehängte Dateien:

Lesenswert?

Alternativ ein Polygon ins Canvas und die Füllung als 
LinearGradientBrush ausführen. Könnte überschaubarer sein als einzelne 
Linien.
So es Achsen usw. braucht eventuell auf eine Lib zurückgreifen

von Bertram S. (bschall)


Angehängte Dateien:

Lesenswert?

Alternativ ein Polygon ins Canvas und die Füllung als
LinearGradientBrush ausführen. Könnte überschaubarer sein als einzelne
Linien.
So es Achsen usw. braucht eventuell auf eine Lib zurückgreifen

von Bertram S. (bschall)


Angehängte Dateien:

Lesenswert?

Alternativ ein Polygon ins Canvas und die Füllung als
LinearGradientBrush ausführen. Könnte überschaubarer sein als einzelne
Linien.
So es Achsen usw. braucht eventuell auf eine Lib zurückgreifen

von Gunnar F. (gufi36)


Lesenswert?

Bertram S. schrieb:
> Alternativ ein Polygon ins Canvas und die Füllung als
> LinearGradientBrush ausführen. Könnte überschaubarer sein als einzelne
> Linien.
> So es Achsen usw. braucht eventuell auf eine Lib zurückgreifen

Hallo Bertram, ganz herzlichen Dank! Das ist super nahe an meiner 
Wunschvorstellung! Mit solcher Hilfe schaffe ich noch eine kometenhafte 
Karriere.... auf meine alten Tage!

von Franko S. (frank_s866)


Lesenswert?

Martin S. schrieb:
> Cool, mein erster Kandidat für mein Greasemonkey Ignorelist Script.

Wen interessiert das?

von Gunnar F. (gufi36)


Lesenswert?

Franko S. schrieb:
> Martin S. schrieb:
>> Cool, mein erster Kandidat für mein Greasemonkey Ignorelist Script.
>
> Wen interessiert das?

Mich. Wenn ich so eine Liste hätte, Platz 1 ist dir sicher!

von Franko S. (frank_s866)


Lesenswert?

Gunnar F. schrieb:
> Mich. Wenn ich so eine Liste hätte, Platz 1 ist dir sicher!
Du brauchst also andere dazu was auf deinen Filter kommen soll?
Einen Schulabschluss hast du vermutlicht nicht oder?

von Martin S. (sirnails)


Angehängte Dateien:

Lesenswert?

Gunnar F. schrieb:
> Franko S. schrieb:
>> Martin S. schrieb:
>>> Cool, mein erster Kandidat für mein Greasemonkey Ignorelist Script.
>>
>> Wen interessiert das?
>
> Mich. Wenn ich so eine Liste hätte, Platz 1 ist dir sicher!

Bin mir noch nicht ganz sicher, ob ich das so lasse. Einerseits wäre mir 
sympatisch, den Beitrag einfach komplett wegzuexen, auf der anderen 
Seite kann das Gespräche aus dem Zusammenhang reißen.

Aktuell arbeitet das Script auch noch mit User-IDs. Ich hatte bisher 
noch keine Motivation, das auf Namen umzustellen. Wenn ich damit 
zufrieden bin, poste ich es mal in den Offtopic.

von Gunnar F. (gufi36)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

Eure Vorschläge haben mir gut weiter geholfen, ich habe jetzt zunächst 
den von Bertram S. umgesetzt, weil es gut aussieht und mit 
C#-Bordmitteln einfach geht.

Jetzt habe ich aber schon wieder ein Problem mit DataBinding! 
(Grrmmpfff!)

Die App dient zur testweisen Integration eines Spektrometers von Jeti, 
der Treiber funktioniert, ich kann verbinden, die Messung auslösen und 
erhalte die Zahlenwerte richtig angezeigt. Siehe Bild!

Das Bild ist aber teilweise Beschiss, weil ich im Konstruktor von 
polygon_vm einfach Daten aus einer erfolgreichen Messung in den 
Programmcode kopiert habe. Wenn der Konstruktor aufgerufen wird, 
funktioniert die Datenbindung ins Canvas. Einmal!
Wenn ich dann den Butten "Draw Graph" drücke, liest die Software vom 
Spektrometer ein neues Array (float), baut das in eine Collection von 
Points um und löst INotifyPropertyChanged aus. Wie fast immer, passiert 
im MainForm nichts!
Das Polygon-Objekt habe ich zunächst wie von Bertram vorgeschlagen, als 
PointCollection angelegt und in XAML einen DataContext auf das Window 
festgelegt. Auch diese Methode aktualisiert das Polygon nicht, nur 
einmal beim Start.

Jetzt habe ich den DataContext vom Canvas in C# definiert und 
versuchsweise aus der PointCollection eine ObservableCollection<Point> 
gemacht, weil nur zweitere das INotifyPropertyChanged implementiert. 
Ergebnis unverändert!
Das OnPropertyChanged-Event löse ich manuell am Ende der 
BuildPolygon-Methode aus, weil ich nicht weiß ob das Ereignis auch von 
der Add-Methode ausgelöst wird.

Das ge7zipte Projekt anbei, mit gelöschten bin/obj-Folder.

Ich freue mich sehr über nochmal so eine gute Hilfe!
Danke!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.