Linienobjekt auf anderen Objekten 'snappen' lassen

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Linienobjekt auf anderen Objekten 'snappen' lassen

Beitrag von af0815 »

Beispiel:
Alles zur Laufzeit und auf Userrequest:
Ich erzeuge 2 Label und eine Linie auf dem Canvas. Dies kann der Benutzer frei positionieren. Wenn der Benutzer das eine Ende der Linie auf einer bestimmten Stelle am Label (Connectionpoint) positioniert, so soll die Linie dort 'kleben' = 'snap' bleiben. :idea:

So wie in den Grafikprogrammen.

Hat schon wer mit dem Erfahrung ? Bis jetzt habe ich zur Laufzeit alles 'statisch' gemacht, würde da aber meinen Horizont gerne erweitern.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Ich hätte da eine idee nur mir ist noch nicht klar was du bewegen kansnt: die line oder die komponenten ,oder beides ?

Lade mal ein bild hoch wie du es dir vorgestellt hast !
MFG
Michael Springwald

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

Ich hätte da eine idee nur mir ist noch nicht klar was du bewegen kansnt: die line oder die komponenten ,oder beides ?

Lade mal ein bild hoch wie du es dir vorgestellt hast !

@Pluto: Alles ist beweglich. Nix is fix. Stell dir vor, du zeichnest eine FlowChart. Da positionierst zu eine Aktion und eine Verzeigung auf dem Canvas, dann verbindest du die beiden mit einem Pfeil. Das ist das ganze was ich will, ABER zur Laufzeit.



Dank eines Tips von obde, habe ich einen Anfang gefunden. In der jvcl gibt es eine Demo mit genau diesem Problemkreis. Und zwar unter 'jvcl\examples\JvDiagramShape\UseCaseEditor' befindet sich eine Demo zu dieser Aufgabenstellung. Das ganze basiert auf Informationen und Code von Jim Cooper (Artikel: Diagramming with Delphi Part 1 & 2).

Die Jedi ist in jedem Fall mal einen Blick wert. Der Nachteil, englisch ist dort ein muß (Was für mich kein Thema ist).
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

obde
Beiträge: 4
Registriert: So 21. Jan 2007, 18:58
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: GT

Beitrag von obde »

Hallo Andi,
ich hab mir mal ein paar Gedanken zu deinen Snap-Objekten gemacht.
Man könnte sich einige Objekte erstellen, die mit Snap-Punkten ausgerüstet werden können. Hier mal eine kleine Beschreibung meiner Idee.

Snappoint
Diese Snappoint kann sich durch drücken der linken Maustaste verschieben lassen. Er übergibt seine Bewegungen an einen Koordinator, der eine Zeichenfläche oder besser ein nicht sichtbare Komponente sein kann. Dieser Koordinator übernimmt die Verwaltung der Punkte untereinander. Er kennt die Position der Punkte und verwaltet eine Liste der eingerasteten Punkte. Der Snappoint selbst kennt noch Eigenschaften wie Fix, d.H. er ist nicht mit der Maus verschiebbar. Diese Eigenschaft wird benötigt wenn der Punkt auf einem Objekt, wie ein Rahmen, sitzt.

Gummibandlinie
Diese hat zwei Snappoints, an den Enden, die sich voneinander unabhängig bewegen lassen. Die Bewegung der Punkte werden wieder an den Koordinator und an das Linienobjekt zurückgegeben. Über das Event OnMove (vom Snappoint) kann man die Gummibandfunktion aktivieren und mit OnMouseUp das Neuzeichnen der Linie anstoßen.

Rahmenobjekt
Diese Objekt kann mehrere Snappoints haben, entweder fest eingebaut oder in einer Liste verwaltet. Verwendet man eine Liste, kann dem Objekt ein x-beliebiger Punkt zugeordnet werden. Die Punkte müssen aber die Eigenschaft Fix haben, da sie nur mit dem Objekt verschoben werden dürfen und nicht allein.
Das Rahmenobjekt könnte zusätzlich noch ganz normale Objekte, wie z.B. TLabel oder TEdit, aufnehmen. Hierbei ist es wichtig die Reihenfolge der Anordnung zu beachten. Das Labelobjekt muss unterhalb des Rahmen liegen, damit es sich durch einen einfachen Klick verschieben lasst. Ein Doppelklick könnte dann die Bearbeitung des Labels aufrufen, z.B. Text Eingabe.


Diese Komponenten sind zwar etwas aufwendiger, aber dafür universell einsetzbar.


Gruß Udo
Dateianhänge
Snappoint.gif
Snappoint.gif (4.82 KiB) 2227 mal betrachtet

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

Hallo obde,
einig mit dem Snappoint, Gummiband und Rahmenobjekt. Es ist für mich ein bischen zu früh, zuerst muß ich die Idee von Jim Cooper noch besser verstehen und vor allen das gewünschte Verhalten.

Vor allen der Snappoint kann ja singular oder plural sein. Wobei ich eher zu singular tendiere, da es einfacher zu implementieren ist und ich sowieso eine linieare Struktur damit abbilden will (Linien bzw. Kreisförmig).
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Ich dachte ich hätte dich verstanden ! aber anscheiend doch noch nicht richtig !

Also möchtes du sowas wie in meinem Paint2 bauen ?
du hast objekte wenn du sie anklickst kommt ein Ramen und dieser Ramen hat 8 Punkte um in zu vergrößern oder zu verkleinern ! meinst du sowas ?
MFG
Michael Springwald

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

Klares Jein, nur hänge ich ein paar Gummibänder zwischen den Objekten auf. Die haben dann auch spezielle Eigenschaften, wie der Transport von Informationen von einem Objekt zu einem anderen.

Die Grafik ist eigentlich nur was für die Präsentation, die Objekte repräsentieren virtuelle Maschinen, die Verbindungen sind der Materialfluß. Das ganze ist dann eine Simulation einer Fertigung und somit später die Spielwiese für Betriebsdatenerfassung.

Zumindest theoretisch :-)
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Ach so.... dann machtes du mehrer objekte miteinander über eine(oder mehrer?) Linen verbinden ? und wenn ich eines der Objkete bewege soll sich die Line mit bewegen ...... und wenn ich auf die line klicke sollen sich die zwei Objekte mit bewegen.....
MFG
Michael Springwald

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

n der jvcl gibt es eine Demo mit genau diesem Problemkreis. Und zwar unter 'jvcl\examples\JvDiagramShape\UseCaseEditor' befindet sich eine Demo zu dieser Aufgabenstellung.

Wie ich schon sagte, dort ist eine Demo. Vielleicht habe ich demnächst auch eine fertig, zumindest s&d (engl. q&d).
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten