added basic save/load

This commit is contained in:
Louis Heredero 2024-07-01 23:25:47 +02:00
parent 5d99a0d2c5
commit efc88658ee
Signed by: HEL
GPG Key ID: 8D83DE470F8544E7
2 changed files with 42 additions and 8 deletions

View File

@ -103,6 +103,10 @@ class Editor:
self.zoom_out() self.zoom_out()
elif event.key == pygame.K_BACKSPACE: elif event.key == pygame.K_BACKSPACE:
self.deleted_selected_objects() self.deleted_selected_objects()
elif event.key == pygame.K_s and event.mod & (pygame.KMOD_CTRL | pygame.KMOD_META):
self.graph.save(input("Save as: "))
elif event.key == pygame.K_l and event.mod & (pygame.KMOD_CTRL | pygame.KMOD_META):
self.graph = Graph.load(input("Load from: "))
elif event.key == pygame.K_RETURN: elif event.key == pygame.K_RETURN:
if len(self.selected_nodes) > 0: if len(self.selected_nodes) > 0:
self.typing_text = "" if len(self.selected_nodes) > 1 else self.graph.nodes[self.selected_nodes[0]].name self.typing_text = "" if len(self.selected_nodes) > 1 else self.graph.nodes[self.selected_nodes[0]].name
@ -319,7 +323,7 @@ class Editor:
pygame.draw.line(self.win, (0, 0, 0), self.world_to_screen(node_1.x, node_1.z), self.world_to_screen(node_2.x, node_2.z), self.edge_detect_radius) pygame.draw.line(self.win, (0, 0, 0), self.world_to_screen(node_1.x, node_1.z), self.world_to_screen(node_2.x, node_2.z), self.edge_detect_radius)
color = (0, 255, 255) if edge_index in self.selected_edges else (255, 0, 0) color = (0, 255, 255) if edge_index in self.selected_edges else (255, 0, 0)
pygame.draw.line(self.win, color, self.world_to_screen(node_1.x, node_1.z), self.world_to_screen(node_2.x, node_2.z), self.line_size) pygame.draw.line(self.win, color, self.world_to_screen(node_1.x, node_1.z), self.world_to_screen(node_2.x, node_2.z), self.line_size)
def render_selection_rect(self): def render_selection_rect(self):
rect = self.selection_rectangle rect = self.selection_rectangle
if rect != None: if rect != None:
@ -328,7 +332,7 @@ class Editor:
width = abs(rect[0][0] - rect[1][0]) width = abs(rect[0][0] - rect[1][0])
height = abs(rect[0][1] - rect[1][1]) height = abs(rect[0][1] - rect[1][1])
pygame.draw.rect(self.win, (32, 32, 32), pygame.Rect(left, top, width, height), self.line_size) pygame.draw.rect(self.win, (32, 32, 32), pygame.Rect(left, top, width, height), self.line_size)
def set_zoom(self, zoom_i: int) -> None: def set_zoom(self, zoom_i: int) -> None:
self.zoom_i = max(0, min(len(self.ZOOMS) - 1, zoom_i)) self.zoom_i = max(0, min(len(self.ZOOMS) - 1, zoom_i))
@ -417,7 +421,7 @@ class Editor:
self.graph.nodes[node].rename_node(self.typing_text) self.graph.nodes[node].rename_node(self.typing_text)
self.typing_text = "" self.typing_text = ""
self.is_renaming_node = False self.is_renaming_node = False
def create_node(self, pos, typing_text = "") -> None: def create_node(self, pos, typing_text = "") -> None:
self.graph.add_node(pos[0], pos[1], typing_text) self.graph.add_node(pos[0], pos[1], typing_text)
if len(self.selected_nodes) == 1: if len(self.selected_nodes) == 1:
@ -514,17 +518,17 @@ class Editor:
if n != 0: if n != 0:
self.selected_nodes.append(self.previously_created_nodes[n - 1]) self.selected_nodes.append(self.previously_created_nodes[n - 1])
self.previously_created_nodes.pop() self.previously_created_nodes.pop()
def create_selection_rect(self, shifting = False): def create_selection_rect(self, shifting = False):
if not shifting: if not shifting:
self.clear_selection() self.clear_selection()
self.previously_created_nodes = [] self.previously_created_nodes = []
mouse_pos = pygame.mouse.get_pos() mouse_pos = pygame.mouse.get_pos()
self.selection_rectangle = [mouse_pos, mouse_pos] self.selection_rectangle = [mouse_pos, mouse_pos]
def expand_selection_rect(self): def expand_selection_rect(self):
self.selection_rectangle[1] = pygame.mouse.get_pos() self.selection_rectangle[1] = pygame.mouse.get_pos()
def release_selection_rect(self, shifting = False): def release_selection_rect(self, shifting = False):
if not shifting: if not shifting:
self.clear_selection() self.clear_selection()

View File

@ -1,9 +1,11 @@
from __future__ import annotations
from math import inf from math import inf
from typing import Iterator, Optional from typing import Iterator, Optional
from src.graph.node import Node from src.graph.node import Node
from src.graph.edge import Edge from src.graph.edge import Edge
class Graph: class Graph:
def __init__(self): def __init__(self):
self.edges: list[Edge] = [] self.edges: list[Edge] = []
@ -47,7 +49,7 @@ class Graph:
def get_edge_nodes(self, edge: Edge) -> tuple[Node, Node]: def get_edge_nodes(self, edge: Edge) -> tuple[Node, Node]:
return self.nodes[edge.start], self.nodes[edge.end] return self.nodes[edge.start], self.nodes[edge.end]
def get_edge_center(self, edge_index: int) -> tuple[float, float]: def get_edge_center(self, edge_index: int) -> tuple[float, float]:
edge = self.edges[edge_index] edge = self.edges[edge_index]
start_n = self.nodes[edge.start] start_n = self.nodes[edge.start]
@ -94,4 +96,32 @@ class Graph:
node_sequences[end] = node_sequences[start].copy() node_sequences[end] = node_sequences[start].copy()
node_sequences[end].append(end) node_sequences[end].append(end)
return node_sequences[target_index] return node_sequences[target_index]
def save(self, path: str) -> None:
with open(path, "w") as f:
for node in self.nodes:
f.write(f"n {node.x} {node.z} {node.name}\n")
f.write("\n")
for edge in self.edges:
f.write(f"e {edge.start} {edge.end} {edge.length}\n")
@staticmethod
def load(path: str) -> Graph:
graph = Graph()
with open(path, "r") as f:
lines = f.read().splitlines()
for line in lines:
if len(line.strip()) == 0:
continue
entry_type, values = line.split(" ", 1)
if entry_type == "n":
x, z, name = values.split(" ", 2)
x, z = int(x), int(z)
graph.add_node(x, z, name)
elif entry_type == "e":
start, end, length = values.split(" ", 2)
start, end, length = int(start), int(end), float(length)
graph.add_edge(start, end, length)
return graph