Schrift
[thread]5066[/thread]

Graph im Canvas zeichnen: Graph im Canvas zeichnen

Leser: 2


<< |< 1 2 >| >> 18 Einträge, 2 Seiten
michael25
 2005-08-31 11:24
#44457 #44457
User since
2005-08-31
23 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen,

ich versuche gerade, ein Programm zum Zeichnen vom Graphen auf dem Tk::Canvas zu erstellen. CPAN habe ich diesbezüglich schon durchsucht: GraphViz u. ä. eignet sich für meine Zwecke eher weniger, da ich die Koordinaten festlegen muss, an denen ein Knoten gezeichnet werden soll.

Zu diesem Zweck habe ich begonnen, von Tk::Canvas eine Klasse abzuleiten, die die Methoden "createNode" und "createEdge" besitzt.

createNode soll:
- Einen Knoten an den Mauskoordinaten zeichnen, und zwar
entweder als Kreis (z.B. createLine), Rechteck oder von einer
GIF-Datei.

createEdge soll:
- Zwei Knoten mit Hilfe einer Kante verbinden und zwar
durch eine direkte Linie, eine gebogene Linie (wie z.B. sie beim
Zeichnen von Automaten verwendet werden) oder
durch eine rechtwinklig gebogene Linie.

Auf dem Canvas soll der Benutzer auf zwei Knoten hintereinander klicken und diese sollen dann durch eine Kante verbunden werden. Auch eine Verbindung eines Knotens mit sich selbst soll möglich sein (mit gebogener Linie).

Die Kanten sollen natürlich am Rand des Knotens starten und enden und nicht an der Stelle mitten im Knoten, auf die der Benutzer geklickt hat. Wie könnte man das lösen (das mit dem Kantenstart- und endpunkt, aber auch für jeden weiteren Tip bin ich sehr dankbar, z.B. Gibt es eine Möglichkeit, gebogene und rechtwinklig gebogene Kanten zu zeichnen)?

Oder noch besser: Gibt es bereits eine Lösung zu diesem Problem (und ich habe sie nur übersehen), die diesen Anforderungen entspricht?

Schon mal vielen Dank!
Michael
renee
 2005-08-31 12:09
#44458 #44458
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Schau Dir mal Crians GED an. Der ist ziemlich gut...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
michael25
 2005-08-31 13:49
#44459 #44459
User since
2005-08-31
23 Artikel
BenutzerIn
[default_avatar]
Danke für den Tip. Das Programm sieht in der Tat sehr gut aus. Das Problem ist nur, dass ich genau den oben beschriebenen "Zeichenteil" für eine eigene Anwendung brauche. Meine Anwendung soll noch Auswertungsfunktionen für bestimmte Graphentypen enthalten, weshalb ich leider nicht auf ein fertiges Programm zurückgreifen kann.
renee
 2005-08-31 14:43
#44460 #44460
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du kannst Dir ja den Code anschauen und Crian ist hier ja auch des öfteren anzutreffen...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
ptk
 2005-08-31 19:08
#44461 #44461
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Oder Crian koennte versuchen, einen Teil des Programms in ein Widget auszulagern.
Vielleicht ist es ja schon?
Crian
 2005-09-01 15:35
#44462 #44462
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Nein, ist es noch nicht, weil ich noch keine eigenen Widgets erstellt habe. Das ist aber ein Thema, das ich sowieso angehen möchte.

Aber ich bin auf jeden Fall (meistens) erreichbar hier im Forum ;)

Eventuell ließen sich die Auswertungsfunktionen ja auch in den GED einbauen, oder ist das etwas sehr spezielles?\n\n

<!--EDIT|Crian|1125574857-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
ptk
 2005-09-01 16:00
#44463 #44463
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Es muss ja kein "echtes" Widget sein, eine eigenen Objektklasse fuer die Zeichenfunktionen ohne restliches UI reicht als erster Schritt. Dann ist es aber nicht mehr weit zum Tk-Widget.
michael25
 2005-09-02 11:29
#44464 #44464
User since
2005-08-31
23 Artikel
BenutzerIn
[default_avatar]
@Crian:
Zu den Auswertungsfunktionen kann ich im Moment noch nicht viel sagen. Es sollen beliebige Graphen erstellt werden können und das Programm soll eine Schnittstelle für andere Programme bieten, die sich um die Auswertung kümmern. Im Moment wäre mir schon sehr damit gedient, wenn das Zeichnen (Verbindungslinien, Verschieben von Knoten etc.) etwas leichter wäre.
michael25
 2005-09-03 21:13
#44465 #44465
User since
2005-08-31
23 Artikel
BenutzerIn
[default_avatar]
Mittlerweile habe ich experimentiert und es können schon ein paar Dinge gezeichnet werden. Jetzt gibt es aber ein neues Problem - offenbar mit der Event-Schleife.

Folgende Ereignisbindungen sind vorhanden:

Code: (dl )
1
2
3
4
$self->CanvasBind('<B1-Motion>' => [\&_drawEdgeEvent, $x, $y, $line, $res[0], $res[1]]);
$self->CanvasBind('<ButtonRelease-1>' => \&_drawEdgeEventFinish);
$self->bind("Node", '<Any-Enter>' => \&_enterNode);
$self->bind("Node", '<Any-Leave>' => \&_leaveNode);


Die Events _enterNode und _leaveNode funktionieren wunderbar, solange nicht gleichzeitig die linke Maustaste gedrückt ist (das Event <B1-Motion> funktioniert). Dann funktionieren die Events <Enter> und <Leave> nur noch bei dem Element, auf dem man die Maustaste urgedrückt hat (<B1-Press>). Bei allen anderen Elementen mit dem Tag 'Node' tut sich nichts mehr. Ich habe auch schon versucht, in der Funktion _drawEdgeEvent $self->update aufzurufen, weil ich bisher der Meinung war, das würde alle anstehenden Events abarbeiten. Eine Besserung brachte das nicht. Weiß jemand Rat?

Michael
Crian
 2005-09-12 15:03
#44466 #44466
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Bezieht sich das jetzt auf den GED oder machst Du es unabhängig davon?
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< |< 1 2 >| >> 18 Einträge, 2 Seiten



View all threads created 2005-08-31 11:24.