diff --git a/common-data-structures.md b/common-data-structures.md new file mode 100644 index 0000000000000000000000000000000000000000..2cd3de74a2488251a91efe15cb6cd7570554ef4f --- /dev/null +++ b/common-data-structures.md @@ -0,0 +1,119 @@ +# Common Data Structures + +Bennenung der Datentypen nicht notwendiger Weise final. + +**Frage:** Gibt es einen eleganten Weg, die Datenstruktur _Graph_ und den Force-Graph _Renderer_ namentlich zu unterscheiden? Momentan gibt es _GraphData_ und _NodeData_, was auf die reine Datenstruktur hinweist, und dann aber _GraphNode_ was auf den Renderer deuten soll, aber eher verwirrt. Vorschläge: + +- Renderer + - _RendererNode_ +- Canvas + - _CanvasNode_ +- UI + - _UINode_ +- Force (Allerdings auch irgendwie irreführend, oder? Ergibt aber Sinn im Hinblick auf die Simulationsattribute vx, vy, ...) + - _ForceNode_ + +## Reine Daten + +Alle URLs sollen absolut als string angegeben werden. + +### GraphData + +- **Nodes**: _NodeData_[] +- **Links**: _LinkData_[] +- **Types**: _NodeTypes_[] + +### NodeData + +- **Id**: number +- **Label**: string +- **Description**: string +- **Type**: _NodeType_ +- **Icon**: string + - URL für Bild für Knoten im Graphen +- **Banner**: string + - URL für Bild in der Detailansicht +- **Video**: string + - URL für Video in Detailansicht +- **References**: string[] + - Liste an weiterführenden URLs + - Werden im Backend dann nicht ordentlich gespeichert, sondern in einer Zelle, Komma-separiert o.ä. +- Folgende Attribue führen über die reine Datenstruktur hinaus, können aber beim laden entsprechend ergänzt werden + - **Links**: _LinkData_[] + - **Neighbours**: _NodeData_[] + - Es sei angemerkt, dass die idealerweise dynamisch über eine Verbindung zum Graphen und einem Getter erstellt werden sollten, damit man die nicht manuell aktuell halten muss. Inbesondere interessant für den Editor. + +So könnte eine dynamische Implementierung der verbundenen Links für eine Node aussehen, wobei `graph` dem zugehörigen Graphen entspricht: + +```ts +public get links(): Link[] { + const links: Link[] = []; + + // Collect all links that are connected to the current node + this.graph.links.forEach((link) => { + // Contains() returns true, if node is part of link + if (link.contains(this)) { + links.push(link); + } + }); + + return links; +} +``` + +### LinkData + +- **Source**: _NodeData_ +- **Target**: _NodeData_ +- Zur Einfacheit vielleicht noch folgende, da nicht immer das gesamte Node Objekt geladen sein wird + - **SourceId**: number + - **TargetId**: number + +### NodeType + +- **Name**: string +- **Color**: string + - Als Hexcode? Datentyp hier noch offen + +## Force-Graph Erweiterungen + +@Matthias, da hattest du doch bereits einiges rausgesucht. Die bisherigen angaben zu _GraphNode_ sind Attribute die ich benötige. + +### GraphNode : _NodeData_ + +- **index** +- **x** +- **y** +- **vx** +- **vy** +- **fx** +- **fy** +- ... + +### GraphLink : _LinkData_ + +- **material?** + +## Erweiterung um grundlegende Funktionen + +### JSONGraph + +Ich weiß nicht, ob _JSON_ ein guter Name dafür ist, doch mir schien _parse_ und _serialize_ teilweise etwas undefiniert. + +- **toJSON()**: any +- **fromJSON(** any **)**: GraphData + +### DisplayGraph + +- **view(** nodeFilter, linkFilter **)**: GraphData + +### EditorGraph + +- **addNode(** _NodeData_ **)**: boolean +- **deleteNode(** _NodeData_ **)**: boolean +- **addLink(** _LinkData_ **)**: boolean +- **deleteLink(** _LinkData_ **)**: boolean +- Sollte von _ManagedData_ erben, welches im Brachn `typescript-graph-object-from-editor` bereits in seiner TypeScript Form in `knowledge-space-wp-plugin/src/editor/js/structures/manageddata.ts` gefunden werden kann. Es enthält neben einigen Attributen auch folgende Funktionen: + - **undo()**: boolean + - **redo()**: boolean + - **storeCurrentData(** description: string **)**